Oracle分组查询group by的用法及讲解

您所在的位置:网站首页 group by用法示例 Oracle分组查询group by的用法及讲解

Oracle分组查询group by的用法及讲解

#Oracle分组查询group by的用法及讲解| 来源: 网络整理| 查看: 265

Oracle分组查询group by的用法及讲解

Oracle分组查询group by的用法及讲解 (baidu.com)

group by是sql中比较强大的功能,是在对数据分组统计时必不可少的用法。但是,对于很多经验不足的同学,经常会写错。今天我们就以Oracle为例,来讲解下分组查询group by的用法。

一,group by 语法规范

首先我们准备一张Student表

CREATE TABLE STUDENT

( SNO VARCHAR2(10) not null,

SNAME VARCHAR2(20),

SAGE NUMBER(2),

SSEX VARCHAR2(5) )

往里面插入几条学生实体记录。再查看数据:

SELECT * FROM STUDENT;

我们使用group by将这些数据按照性别进行分组:

SELECT * FROM STUDENT GROUP BY SSEX;

不幸的是,执行失败了,提示:不是 GROUP BY 表达式!

原因是group by 分组查询,select子句后的字段必须来自group by后的分组字段。于是 我们执行SQL

SELECT SSEX FROM STUDENT GROUP BY SSEX;

这下成功地将数据分为了两组。我们接下来使用下聚合函数

SELECT SSEX,MAX(SAGE) FROM STUDENT GROUP BY SSEX;

注意这条sql语句,select子句中聚合函数使用了SAGE(年龄)这个字段,那会不会违背了前面所说的 “select子句后的字段必须来自group by后的分组字段”这个规律呢,我们来执行一下:

能正常执行,成功地按照了性别分组,并且查询出了性别对应年龄最大的学生。于是我们可以得出规律:select子句后的任一非聚合函数字段都应来源于group by 分组语句后,否则语法会编译不通过。

二,group by 用法的意义

我们都知道group by 是用来分组的,那么具体怎么分组,对应的语句又怎么写呢?我们一起来研究下。

示例:按照年龄将学生分组。

很多人会这样写:

SELECT * FROM STUDENT GROUP BY SSAGE

上面已经证实过了,这样子语法不通过。

SELECT SSAGE FROM STUDENT GROUP BY SSAGE

如果这样写的话,也只会单纯地将年龄分组。

正确的写法是这样的:

SELECT SNAME,SAGE FROM STUDENT GROUP BY SAGE,SNAME ORDER BY SAGE;

可以看出,group by 分组是按照group by后的字段组合来进行分组的。也就是说你group by后给了我几个字段,我就按照这几个字段组合成一条记录,若有重复的记录,就属于同一组,最后将所有的分组返回给你。

同时上诉sql的order by语句也要符合group by的语法,即order by后的字段必须来源于group by分组字段。所以我们可以把分出来的组理解为试图,所有的其他操作都基于这张视图。

三,分组查询的筛选where和having

示例:查询出性别为男的学生并按照年龄分组,并筛选出年龄大于21岁的

我们首先实现钱半部分:查询出性别为男的学生并按照年龄分组

SELECT SNAME,SAGE FROM STUDENT where SSEX='男' GROUP BY SNAME,SAGE

然后使用having语句筛选:

SELECT SNAME,SAGE FROM STUDENT where SSEX='男' GROUP BY SNAME,SAGE HAVING SAGE>'21'

查询结果:

可以看到,小于等于21岁的男同学都被过滤掉了。

我们这里可以进行总结下:

1. 当在一个SQL中同时使用where和group by和having子句时,其执行顺序为:where>group by>having。

2. 同时where子句作用于表或者视图,having子句作用于组,having子句必须作用在group by之后。

以上三点就是分组查询group by的用法及讲解。希望大家多多练习,多多实践。温故而知新!

最后祝大家身体健康,财源滚滚!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3